package questionnaire.service;

import org.springframework.stereotype.Service;
import questionnaire.controller.vo.QuestionnaireVO;
import util.ErrorCode;
import util.ResponseUtil;

import java.lang.reflect.Field;

/**
 * @author: cjn
 * @date: 2021/1/26 10:38
 */
@Service
public class QuestionnaireService {
    //内部类，封装了返回结果形式
    class ScoreAndConclusionRes {
        private double m_score;
        private String m_conclusion;

        public ScoreAndConclusionRes(double s, String c){
            this.m_score = s;
            this.m_conclusion = c;
        }

        public double getM_score() {
            return m_score;
        }

        public void setM_score(double m_score) {
            this.m_score = m_score;
        }

        public String getM_conclusion() {
            return m_conclusion;
        }

        public void setM_conclusion(String m_conclusion) {
            this.m_conclusion = m_conclusion;
        }
    }

    //根据体征项计算分数（0.5分），不叠加
    public ScoreAndConclusionRes calcScoreByLifeSigns(double temperature, double pulseRate, double respiratoryRate, double systolicPressure, double diastolicPressure){
        double score = 0.0;
        String conclusion= "";
        if(temperature < 36 || temperature > 37.3){
            score = 0.5;
            //出现体温升高
            if(temperature > 37.3){
                conclusion += "请注意休息，多饮水，监测体温变化，如果体温仍高可以采用湿毛巾擦拭身体有助于降温，如果体温继续升高应向医生咨询。";
            }
        }
        if(pulseRate < 60 || pulseRate > 100){
            score = 0.5;
        }
        if(respiratoryRate < 12 || respiratoryRate > 20){
            score = 0.5;
        }
        if(systolicPressure < 90 || diastolicPressure < 60){
            score = 0.5;
        }
        //出现血压升高
        if( systolicPressure > 140 || diastolicPressure > 90){
            score = 0.5;
            conclusion += "请重复测量血压，如果血压仍然是升高的话，应去医院请医生检查明确高血压病诊断；如果原有高血压病，提示目前血压控制不好，应找医生调整降压药使用。同时应控制饮食和增加适当运动，有助于高血压病的控制和预防。";
        }
        ScoreAndConclusionRes res = new ScoreAndConclusionRes(score, conclusion);
        return res;
    }

    //近期发病——根据第8题症状计算分数（1分）,不叠加
    public double calcScoreBySymptom(int symptomNums){
        double score = 0.0;
        //无论几个症状，均为2分
        if(symptomNums > 0){
            score = 1.0;
        }
        return score;
    }

    //根据生活方式计算分数（1分），不叠加
    /*
    锻炼方式: 9题，选择"不锻炼"或“偶尔锻炼”前端就返回1，其他返回0
    饮食习惯：12题多选，选择“荤食为主、多盐、多油、多糖”就返回1，其他返回0
    吸烟：13题，选择了"吸烟"，前端就返回1，否则返回0
    喝酒：14题，选择了“每天"或“经常”，前端就返回1，否则就返回0
     */
    public ScoreAndConclusionRes calcScoreByDailyHabits(int exerciseMode, int eatingHabits, int isSmoke, int isDrink){
        double score = 0.0;
        String conclusion = "";
        if(exerciseMode == 1){
            score = 1;
            conclusion += "每日适当运动是一种健康的生活方式，可降低慢性疾病的发生，对已有慢性疾病的人适当的运动也可以对药物治疗有辅助效果，也有助于降低慢性疾病并发症的发生。开始锻炼应循序渐进，贵在坚持。";
        }
        if(eatingHabits == 1){
            score = 1;
            conclusion += "荤食和多盐、多油、多糖饮食可诱发高血压、糖尿病、冠心病等慢性疾病，低盐、低油、低糖饮食是一种很好的生活方式，可以改善慢性疾病症状以及降低发病风险。";
        }
        if(isSmoke == 1){
            score = 1;
            conclusion += "吸烟会增加高血压、冠心病、脑卒中、慢性阻塞性肺疾病、肺癌等疾病发生风险，应尽早戒烟。";
        }
        if(isDrink == 1){
            score = 1;
            conclusion += "大量饮酒会增加高血压、冠心病、脑卒中、胃出血、肝损伤以及脑组织损伤等疾病发生风险，一次大量饮酒可以引发急性酒精中毒、意外伤害等，应避免大量饮酒。";
        }
        ScoreAndConclusionRes res = new ScoreAndConclusionRes(score, conclusion);
        return res;
    }

    //基础疾病（3分），有1种3分，每增加一种就加1分
    /*
    慢阻肺(copd)：29题选了这个就返回1，否则返回0
    高血压(hypertension)、冠心病(coronaryDisease)：31题两项都选了就返回2，选一项就返回1，都没选就返回0
    糖尿病(diabetes)：33题，选了就返回1，否则返回0
    */
    public double calcScoreByBasicDisease(int copd, int hypertension, int coronaryDisease, int diabetes){
        double score = 0.0;
        int temp = copd + hypertension + coronaryDisease + diabetes;
        if(temp > 1){
            score = 2 + temp; //每增加一种就加1分
        }else{
            score = temp * 3;
        }
        return score;
    }

    //家族病史(0.5分)
    /*
     50和51题，家族病史多选，返回是否有家族病史，有的话返回1，没有返回0，不叠加
     */
    public double calcByFamilyHistory(int hasFamilyHistory){
        double score = hasFamilyHistory * 0.5;
        return score;
    }

    //严重并发症(2分)，不叠加
    /*
       脑血栓(cerebralThrombosis)：有此项并发症返回1，否则0，下同；
       心衰(heartFailure)
       肾衰(renalFailure)
       白内障(cataract)
       糖尿病视网膜病变(diabeticRetinopathy)
     */
    public double calcScoreByComplications(int cerebralThrombosis, int heartFailure, int renalFailure, int cataract, int diabeticRetinopathy){
        double s = 0.0;
        if((cerebralThrombosis | heartFailure | renalFailure | cataract | diabeticRetinopathy) > 0){
            s = 2.0;
        }
        return s;
    }


    //不规范治疗(1分)，依据“是否按时服药”，选“否”返回1，选“是”返回0
    public double calcScoreByTreatment(int takeMedicine){
        double s = 0.0;
        if(takeMedicine > 0){
            s = 1.0;
        }
        return s;
    }


    //计算总分返回结论
    public String calcFinalScore(QuestionnaireVO questionnaireVO){
        //判断前端传来的数据格式是否正确
        if(checkObjFieldIsNull(questionnaireVO)){
            //400 bad request
            return ResponseUtil.getResponseString(ErrorCode.NOT_EXIST, "数据类型或格式有误", "");
        }

        //计算分数
        ScoreAndConclusionRes byLifeSigns = calcScoreByLifeSigns(questionnaireVO.getTemperature(), questionnaireVO.getPulseRate(),
                questionnaireVO.getRespiratoryRate(), questionnaireVO.getSystolicPressure(),questionnaireVO.getDiastolicPressure());
        double bySymptom = calcScoreBySymptom(questionnaireVO.getSymptomNums());
        ScoreAndConclusionRes byDailyHabits = calcScoreByDailyHabits(questionnaireVO.getExerciseMode(),questionnaireVO.getEatingHabits(),
                questionnaireVO.getIsSmoke(),questionnaireVO.getIsDrink());
        double byBasicDisease = calcScoreByBasicDisease(questionnaireVO.getCopd(),questionnaireVO.getHypertension(),
                questionnaireVO.getCoronaryDisease(),questionnaireVO.getDiabetes());
        double byFamilyHistory = calcByFamilyHistory(questionnaireVO.getHasFamilyHistory());
        double byComplications = calcScoreByComplications(questionnaireVO.getCerebralThrombosis(), questionnaireVO.getHeartFailure(), questionnaireVO.getRenalFailure(), questionnaireVO.getCataract(), questionnaireVO.getDiabeticRetinopathy());
        double byTreatment = calcScoreByTreatment(questionnaireVO.getTakeMedicine());
        //总分,共7项
        double score = byLifeSigns.getM_score() + byDailyHabits.getM_score() + byBasicDisease + byFamilyHistory + bySymptom + byComplications + byTreatment;

        //根据分数返回对应结论
        String conclusion = "您的评分为" + score + "分。";
        if(score <= 1){
            conclusion += "您目前属于基本健康状态，如果您有慢性疾病家族病史，应该注意戒烟、限量饮酒，控制高热量食物摄入，建议低盐、低脂、低糖饮食，适量增加运动，保持良好的生活方式。";
        }
        else if(1 < score && score < 3){
            conclusion += "您现有不良生活方式，如吸烟、大量饮酒、不当饮食、作息不规律，或有家族慢病史，以及新出现了身体异常等某些问题，经综合评估表明您有患慢性疾病的风险，需要改变不良生活方式，调整饮食结构（采用低盐、低脂、低糖饮食），增加规律身体运动。定期进行健康咨询和体检评估。";
        }else if(3 <= score  && score < 5){
            conclusion += "您诊断有慢性疾病，并存在身体检查的异常情况，希望能够采取健康的生活方式，戒烟、限制饮酒，控制高盐、高脂、高糖饮食，适当规律运动，在医生指导下采取规范的基础疾病治疗和管理，定期到医疗机构检查评估。";
        }else if(5 <= score  && score < 8){
            conclusion += "您患有";
            if(questionnaireVO.getCopd() == 1){
                conclusion += "“慢阻肺”";
            }
            if(questionnaireVO.getHypertension() == 1){
                conclusion += "“高血压”";
            }
            if(questionnaireVO.getCoronaryDisease() == 1){
                conclusion += "“冠心病”";
            }
            if(questionnaireVO.getDiabetes() == 1){
                conclusion += "“糖尿病”";
            }
            conclusion += "等慢性疾病，并存在身体检查的异常情况，如果还有不良生活方式，如吸烟、大量饮酒、不健康饮食，不能够坚持规范的基础疾病治疗和管理，近期如果出现疾病临床症状，表明慢性疾病没能得到良好的控制，身体处于不良状态。希望能到医疗机构进行检查评估，得到医生的指导，使疾病得到有效的控制。";
        }else if(8 <= score  && score <= 10){
            conclusion += "您同时患有多种慢性疾病，并有原发病导致的并发症，如脑卒中、慢性心衰、心肌梗死、肾功能不全等，近期如果经常出现急性病症发作，以及治疗不当或效果欠佳，表明所患慢性疾病没能得到有效的控制，或有病情逐渐加重的趋势，需要严格控制不良生活方式，希望尽快到医疗机构进行检查、治疗。";
        }else{
            conclusion += "您目前处于危重症疾病状态，是在原有慢性疾病和各种并发症的基础上，新发生急性病症，表明病情加重，应立即呼救120，尽快急诊救治。";
        }

        if(score <= 10) {
            //体温高、血压高的建议
            if (byLifeSigns.getM_conclusion().length() > 0) {
                conclusion += "建议：";
                conclusion += byLifeSigns.getM_conclusion();
            }

            //生活方式的建议
            if (byDailyHabits.getM_conclusion().length() > 0) {
                conclusion += "有关生活方式的建议：";
                conclusion += byDailyHabits.getM_conclusion();
            }
        }

        return ResponseUtil.getResponseString(ErrorCode.SUCCESSFUL, "查询成功", conclusion);
    }

    //判断QuestionnaireVO对象的属性是否有null值
    public boolean checkObjFieldIsNull(Object obj){
        boolean flag = false;
        for(Field f : obj.getClass().getDeclaredFields()){
            f.setAccessible(true);
            try {
                if(f.get(obj) == null){
                    flag = true;
                    return flag;
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return flag;
    }

}
